var express = require('express');
var router = express.Router();
var http = require('http');
const https = require('https')
var cheerio = require('cheerio');
var loggerInfo = require('../utils/winston-date').logger;// 自定义打印 包含日志文件分割功能
var loggerError = require('../utils/winston-date').loggerError;// 自定义打印 包含日志文件分割功能
var iconv = require('iconv-lite');
let db = require('../utils/db');//打开数据库连接
let connection = db.connection();//打开数据库连接
var hcsy = require('../utils/hcsy-date');//引用自己的文件
let appConfig = require('../utils/app-config');//基础配置
var request = require('request');// 请求 第三方Api
var UpdateDataNum = 0;// 更新数据的次数
var schedule = require('node-schedule');//定时器依赖
let basic = require("../utils/basic.js");
/**
 * 京东价格
 */
//获取京东价格该商品价格
router.get("/getPriceFromJD1", function (req, res, next) {
    var url = 'https://item.jd.com/19080285577.html';
    https.get(url, function (sres) {
        var chunks = [];
        sres.on('data', function (chunk) {
            chunks.push(chunk);
        });
        //loggerInfo.info("getJobs2-ondatachunk", chunks);
        // chunks里面存储着网页的 html 内容，将它转码传给 cheerio.load 之后
        // 就可以得到一个实现了 jQuery 接口的变量，将它命名为 `$`
        // 剩下就都是 jQuery 的内容了
        sres.on('end', function () {
            //由于咱们发现此网页的编码格式为gb2312，所以需要对其进行转码，否则乱码
            //依据：“<meta http-equiv="Content-Type" content="text/html; charset=gb2312">”
            var html = iconv.decode(Buffer.concat(chunks), 'gbk');
            //loggerInfo.info("getJobs2-onendchunk", html);
            var $ = cheerio.load(html, { decodeEntities: false });
            var Price = "";
            var imgUrl = '';
            try {
                Price = $(".J-p-19080285577").text();
                imgUrl = $("#spec-img");
                loggerInfo.info("商品名称", $(".sku-name").html());
                loggerInfo.info("商品图片", imgUrl[0].attribs);
                loggerInfo.info("商品图片", imgUrl[0].attribs["data-origin"]);
            } catch (error) {
                loggerError.error(error);
                res.json(Object.assign(appConfig.errorJson(), { data: error }));
                return;
            }
            loggerInfo.info(Price);
            res.json(Object.assign(appConfig.successJson(), { data: Price }));
        })
    })
})
/**
 * 添加京东价格提醒
 * productId: 商品Id（必须）
 * userId: 用户id（必须）
 * addPrice: 添加时的价格（可不传，默认添加时抓取的价格）
 * price ：提醒价格（可不传）
 * vipState : 0 ：普通价 1：会员价（必须）
 * JDorder 京东订单号（必须）	
 */
//获取京东该商品价格
router.post("/addPriceFromJD", function (req, res, next) {
    var productId = req.body.productId;
    var userId = req.body.userId;
    var addPrice = req.body.addPrice ? req.body.addPrice : "0";
    var price = req.body.price ? req.body.price : "0";
    var vipState = req.body.vipState;
    var JDorder = req.body.JDorder;
    if (!productId) {
        res.json(Object.assign(appConfig.errorJson(), { msg: '商品Id不能为空' }));
        return false;
    }
    if (!userId) {
        res.json(Object.assign(appConfig.errorJson(), { msg: '用户Id不能为空' }));
        return false;
    }
    if (!vipState) {
        res.json(Object.assign(appConfig.errorJson(), { msg: 'vipState不能为空' }));
        return false;
    }
    if (!JDorder) {
        res.json(Object.assign(appConfig.errorJson(), { msg: 'JDorder不能为空' }));
        return false;
    }
    loggerInfo.info("参数信息", "productId:" + productId, "userId:" + userId, "addPrice:" + addPrice, "price:" + price, "vipState:" + vipState);
    var priceUrl = 'https://p.3.cn/prices/mgets?skuIds=J_' + productId;//价格url 用来获取商品价格
    var productUrl = 'https://item.jd.com/' + productId + '.html';//商品url 用来获取商品名称
    var e = request({
        url: priceUrl,
        method: 'GET',
        headers: { 'Content-Type': 'text/json' }
    }, function (error, response, body) {
        if (!error && response.statusCode == 200) {
            var priceResult = JSON.parse(body);//抓取到价格
            priceResult = priceResult[0];
            loggerInfo.info("商品价格抓取结果", priceResult);
            // res.render('task', { 'data': JSON.parse(body) });
            // res.json(Object.assign(appConfig.successJson(), { data: JSON.parse(body) }));
            https.get(productUrl, function (sres) {
                var chunks = [];
                sres.on('data', function (chunk) {
                    chunks.push(chunk);
                });
                //loggerInfo.info("getJobs2-ondatachunk", chunks);
                // chunks里面存储着网页的 html 内容，将它转码传给 cheerio.load 之后
                // 就可以得到一个实现了 jQuery 接口的变量，将它命名为 `$`
                // 剩下就都是 jQuery 的内容了
                sres.on('end', function () {
                    //由于咱们发现此网页的编码格式为gb2312，所以需要对其进行转码，否则乱码
                    //依据：“<meta http-equiv="Content-Type" content="text/html; charset=gb2312">”
                    var html = iconv.decode(Buffer.concat(chunks), 'gbk');
                    //loggerInfo.info("getJobs2-onendchunk", html);
                    var $ = cheerio.load(html, { decodeEntities: false });
                    var productName = "";//商品名称
                    var imgUrl = '';//商品图片url
                    try {
                        productName = $(".sku-name").html().trim();
                        imgUrl = $("#spec-img")[0].attribs["data-origin"];
                        loggerInfo.info("商品名称抓取结果", productName);
                        loggerInfo.info("商品图片", imgUrl);
                        //将数据存储到数据库
                        var currentPrice = 0;
                        var currentPriceToVIP = 0;
                        currentPrice = priceResult.p;// 普通价格
                        if (priceResult.tpp) {
                            currentPriceToVIP = priceResult.tpp;// plus价格
                        }
                        loggerInfo.info("priceResult.p:::::::", priceResult.p);
                        //判断数据库里面是否已有该商品
                        var querySQL = 'SELECT *  FROM `JDproduct` WHERE productId=' + productId + '';
                        loggerInfo.info("querySQL：》》》》", querySQL);
                        var addProductSQL = 'INSERT INTO `JDproduct` (`productId`, `productName`,`productImg`, `currentPrice`, `currentPriceToVIP`, `creaTime`, `updateTime`) VALUES (' + productId + ', "' + productName + '",  "' + imgUrl + '","' + currentPrice + '", "' + currentPriceToVIP + '", now(), now());'
                        connection.query(querySQL, function (e, d, f) {
                            if (e) {
                                loggerError.error("判断数据库里面是否已有该商品查询出错" + productId, e);
                                res.json(Object.assign(appConfig.errorJson(), { msg: "系统出错" }));
                                return false;
                            }
                            //loggerInfo.info("判断是否存在商品：",d);
                            //当数据已经存在
                            if (d && d.length > 0) {
                                addProductSQL = 'UPDATE `JDproduct` SET `currentPrice`="' + currentPrice + '", `currentPriceToVIP`="' + currentPriceToVIP + '", `updateTime`=now() WHERE (`productId`=' + productId + ');';
                            }
                            loggerInfo.info("addProductSQL：》》》》", addProductSQL);
                            connection.query(addProductSQL, function (ce, cd, cf) {
                                //loggerInfo.info("执行》》《《ce》《ce》《ce》《ce》《》《》《》",ce);
                                if (ce) {
                                    loggerError.error("插入或更新商品信息时出错" + productId, ce);
                                    res.json(Object.assign(appConfig.errorJson(), { msg: "系统出错" }));
                                    return false;
                                } else {
                                    //将数据绑定到 用户商品关联表 关系已存在则 直接更新 ，不存在则新增
                                    //当用户没有传数据时 默认当时查询的价格 确定不了用户的会员等级 依照传值判断
                                    if (addPrice == 0) {
                                        if (vipState == 0) {
                                            addPrice = priceResult.p;
                                        } else {
                                            addPrice = priceResult.tpp;
                                        }
                                    }
                                    if (price == 0) {
                                        price = addPrice;
                                    }
                                    var addProductToUserSQL = 'INSERT INTO `JDproductToUser` (`userId`, `productId`, `price`, `addPrice`, `vipState`,`addTime`,`JDorder`) VALUES (' + userId + ',' + productId + ',' + price + ',' + addPrice + ',' + vipState + ',now(),"' + JDorder + '");';
                                    connection.query('SELECT * FROM `JDproductToUser` WHERE userId="' + userId + '" and productId="' + productId + '" and JDorder="' + JDorder + '"', function (se, sd, sf) {
                                        //loggerInfo.info("执行》》《《se》《se》《se》《》《》《》《》",se,sd,sd.length);
                                        if (se) {
                                            loggerError.error("查询商品与用户关系时出错" + productId, se);
                                            res.json(Object.assign(appConfig.errorJson(), { msg: "系统出错" }));
                                            return false;
                                        }
                                        if (sd && sd.length > 0) {
                                            var JDproductToUserResutl = sd;//
                                            var sAddPrice = addPrice;
                                            if (sAddPrice == 0 && vipState == 0) {
                                                sAddPrice = priceResult.p;// 普通价格
                                            }
                                            if (sAddPrice == 0 && vipState == 1) {
                                                sAddPrice = priceResult.tpp;// plus价格
                                            }
                                            var sPrice = price;//提醒价格
                                            if (!sPrice || sPrice == 0) {
                                                sPrice = JDproductToUserResutl.price;
                                            }
                                            addProductToUserSQL = 'UPDATE `JDproductToUser` SET `price`=' + sPrice + ', `addPrice`=' + sAddPrice + ', `vipState`=' + vipState + ', `addTime`=now() WHERE `userId`="' + userId + '" and `productId`="' + productId + '" and `JDorder`="' + JDorder + '"';
                                        }
                                        loggerInfo.info("addProductToUserSQL ：》》》》", addProductToUserSQL);
                                        connection.query(addProductToUserSQL, function (ae, ad, af) {
                                            if (ae) {
                                                loggerError.error("插入或更新商品与用户关系时出错" + productId, ae);
                                                res.json(Object.assign(appConfig.errorJson(), { msg: "系统出错" }));
                                                return false;
                                            }
                                            res.json(Object.assign(appConfig.successJson(), { msg: "操作成功" }));
                                        });
                                    })
                                }
                            });
                        });
                        // res.json(Object.assign(appConfig.successJson(), { msg: "添加成功" }));
                    } catch (error) {
                        loggerError.error(error);
                        res.json(Object.assign(appConfig.errorJson(), { data: error }));
                        return;
                    }
                })
            })
        } else {
            loggerError.error(productId + "商品价格获取失败", error);
            res.json(Object.assign(appConfig.errorJson(), { msg: '系统错误' }));
            return false;
        }
    });
})

/**
 * 定时更新数据
 */
function UpdateData() {
    connection.query("SELECT productId FROM `JDproduct`;", function (e, d, f) {
        if (e) {
            loggerError.error("定时更新数据错误", e);
            return false;
        } else {
            var arr = d;
            for (var i = 0; i < arr.length; i++) {
                var v = arr[i];
                executeSQL(v);
            }
            UpdateDataNum += 1;
        }
    })
}
function executeSQL(v) {
    var priceUrl = 'https://p.3.cn/prices/mgets?skuIds=J_' + v.productId;//价格url 用来获取商品价格
    var e = request({
        url: priceUrl,
        method: 'GET',
        headers: { 'Content-Type': 'text/json' }
    }, function (error, response, body) {
        if (!error && response.statusCode == 200) {
            var priceResult = JSON.parse(body);//抓取到价格
            priceResult = priceResult[0];
            loggerInfo.info(v + "新的价格", priceResult);
            var currentPriceToVIP = 0;
            if (priceResult.tpp) {
                currentPriceToVIP = priceResult.tpp;
            }
            var updateSQL = 'UPDATE `JDproduct` SET `currentPrice`="' + priceResult.p + '", `currentPriceToVIP`="' + currentPriceToVIP + '", `updateTime`=now() WHERE (`productId`=' + v.productId + ');';
            loggerInfo.info("updateSQL 》》》》》》》", updateSQL);
            connection.query(updateSQL, function (ce, cd, cf) {
                if (ce) {
                    loggerError.error(v + "更新商品价格出错", e);
                    res.json(Object.assign(appConfig.errorJson(), { msg: "系统出错" }));
                    return false;
                }
                loggerInfo.info(v + "价格更新成功");
            })
        } else {
            loggerError.error("获取价格出错", error);
            res.json(Object.assign(appConfig.errorJson(), { msg: "系统出错" }));
            return false;
        }
    })
}
//查询视图 根据每个(废弃)
function changeState(obj){
    
}
//定时器 分成两个函数是解决 for 循环里面异步 参数重复赋值的问题
function scheduleCronstyle() {
    //一个小时执行一次 ，时间是每小时 1分30秒  schedule.scheduleJob('30 * * * * *', function () {
    schedule.scheduleJob('30 1 * * * *', function () {
        UpdateData();
        loggerInfo.info("定时器启动" + UpdateDataNum);
    });
}
scheduleCronstyle();



/**
 * 查询用户的名下的产品 未分页 查询最近8天内的数据 （家电是30天，手机7天）
 * 价保是需要留下凭证才可以价保的。截图不算，需要在下单，取消掉
 * userId 用户Id （必须）
 * productId 商品Id （非必须）废弃
 * value 新增（查询条件 改为 商品Id 订单号  商品名称）
 * type (all 查询全部 part 查询可价保的数据)
 */
router.get("/getInfoByUserId", function (req, res, next) {
    var userId = req.query.userId;
    var value = req.query.value;
    var type=req.query.type;
    if (!userId) {
        res.json(Object.assign(appConfig.errorJson(), { msg: "userId不能为空" }));
        return false;
    }
    var querySQL = 'SELECT * FROM `view_productToUser` where userId="' + userId + '"';
    var querySQL2 ='';//当是PLUS 价格且 PLUS价格不为0
    var querySQL3 ='';//当是PLUS 价格且 PLUS价格为0 则对比普通价格和提醒价格
    if (value) {
        querySQL += ' and (productId like "%' + value + '%" or productName like "%' + value + '%" or JDorder like "%' + value + '%" )';
    }
    querySQL += ' and DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= `addTime`';
    querySQL2 = querySQL;
    querySQL3 = querySQL;
    if(type=='part'){
        querySQL+=' and view_producttouser.currentPrice<view_producttouser.price and view_producttouser.vipState=0';
        querySQL2+=' and view_producttouser.currentPriceToVIP<view_producttouser.price and view_producttouser.vipState=1';
        querySQL3+=' and view_producttouser.currentPrice<view_producttouser.price and view_producttouser.vipState=1 and view_producttouser.currentPriceToVIP=0';
        querySQL+=' union '+querySQL2+' union '+querySQL3;
        loggerInfo.info("合并查询的SQL>>>>>>>>>",querySQL);
    }
    connection.query(querySQL, function (e, d, f) {
        if (e) {
            loggerError.error(querySQL, "查询用户" + userId + "的名下的产品", e);
            res.json(Object.assign(appConfig.errorJson(), { msg: "系统出错" }));
            return false;
        }
        //loggerInfo.info(value,querySQL);
        res.json(Object.assign(appConfig.successJson(), { data: d }));
    });
})




module.exports = router;